#include "faceserver.h"
#include "ui_faceserver.h"

#include <QDateTime>

faceserver::faceserver(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::faceserver)
{
    ui->setupUi(this);
     connect(&server,&QTcpServer::newConnection,this,&faceserver::read);//如果有新连接就去调用read函数
    server.listen(QHostAddress::Any,7777);//监听该端口
    bsize=0;
    model.setTable("employee");// 构造函数中 设置要查找的表

    QThread* thread=new QThread();
    object.moveToThread(thread);
    thread->start();//启动线程，还未  执行线程 任务函数
   connect(this,&faceserver::query,&object,&qobjectface::face_query);//如果发出查找信号，object对象就会去调用face_query进行查找
   connect(&object,&qobjectface::send_faceid,this,&faceserver::recv_faceid);//如果收到返回faceid的信号，就去调用recv_faceid槽函数
}

faceserver::~faceserver()
{
    delete ui;
}

void faceserver::read()
{
        tsocket=server.nextPendingConnection();//使用tsocket套接字来对客户端发来的数据进行处理
        connect(tsocket,&QTcpSocket::readyRead,this,&faceserver::read_data);//如果该套接字收到readyread信号，说明客户端发消息过来了，去调用readyread

}

void faceserver::read_data()
{
    //QString meg=tsocket->readAll();//使用readall函数将客户端消息读出来
   // qDebug()<<meg;//并且打印出来
      QDataStream stream(tsocket);//套接字绑定数据流
      stream.setVersion(QDataStream::Qt_5_14);
      if(bsize==0)
      {
           if(tsocket->bytesAvailable()<(qint64)sizeof(bsize)) return ;
           stream>>bsize;



      }

      if(tsocket->bytesAvailable()<bsize)
      {
          return ;

      }
      QByteArray data;
      stream>>data;
      bsize=0;
      if(data.size()==0)
      {
          return ;


      }
      QPixmap mp;
      mp.loadFromData(data,"jpg");
      mp=mp.scaled(ui->buffer->size());
      ui->buffer->setPixmap(mp);

     /* cv::Mat  faceimage;
      std::vector<uchar>decode;
      decode.resize(data.size());
      memcpy(decode.data(),data.data(),data.size());
      faceimage=cv::imdecode(decode,cv::IMREAD_COLOR);
      int faceid=object.face_query(faceimage);
      qDebug()<<"00000"<<faceid;*/


      cv::Mat  faceimage;// 保存解码之后的照片
      std::vector<uchar>decode;//解码函数第一个参数
      decode.resize(data.size());//扩充容量
      memcpy(decode.data(),data.data(),data.size());//将客户端采集到的图片data拷贝到decode中去
       faceimage=cv::imdecode(decode,cv::IMREAD_COLOR);//解码后的图片放在faceiamge中


       // 使用 多线程来优化查找函数


       //int faceid=object.face_query(faceimage);// 查找过程慢
      // qDebug()<<"00000"<<faceid;
       emit query(faceimage);



}

void faceserver::recv_faceid(int64_t faceid)
{
    qDebug()<<"00000"<<faceid;
    if(faceid<0)
    {

        QString msg=QString("{\"employeeID\":\"none\",\"name\":\"none\",\"department\":\"none\",\"time\":\"none\"}");//如果没识别到人脸就返回none
        tsocket->write(msg.toUtf8());//将对应faceid 对应信息发送给客户端

    }
    else
    { // 查询人脸 faceid 对应人脸信息
        model.setFilter(QString("faceID=%1").arg(faceid));//设置过滤器，找出 该表中对应faceid的 一列数据
        model.select();//进行查找
        if(model.rowCount()==1)//有 一行数据说明找到了
        {

            QSqlRecord   record= model.record(0);// 保存第一行记录---->faceid对应信息
            //构建json格式字符串
             QString msg=QString("{\"employeeID\":\"%1\",\"name\":\"%2\",\"department\":\"%3\",\"time\":\"%4\"}")
                     .arg(record.value("employeeID").toString())
                     .arg(record.value("name").toString())
                     .arg(record.value("department").toString())
                     .arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"));
             //发送工号，名字，部门，当前时间信息

       // 考勤表
             QString  insertsql=QString("insert into attendance(employeeID) values('%1')").arg(record.value("employeeID").toString());//考勤id 自增长不用管
             QSqlQuery query;// 构建语句变量                                           //时间 采用缺省值即可
             if(!query.exec(insertsql))//插入失败  //执行语句
             {


                 QString msg=QString("{\"employeeID\":\"none\",\"name\":\"none\",\"department\":\"none\",\"time\":\"none\"}");//如果没识别到人脸就返回none
                 tsocket->write(msg.toUtf8());//将对应faceid 对应信息发送给客户端
                 return;

             }
             else
              {

                  tsocket->write(msg.toUtf8());//将对应faceid 对应信息发送给客户端

             }



        }}
}

